package cn.wolfcode.service;

import cn.wolfcode.domain.OperateIntegralVo;
import cn.wolfcode.domain.RefundVo;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

@LocalTCC
public interface IUsableIntegralService {

    /**
     * 积分支付
     */
    String doPay(OperateIntegralVo operateIntegralVo);

    /**
     * 积分退款
     */
    boolean doRefund(RefundVo refundVo);


    /**
     * 一阶段 TCC 的 try 方法，实现用户积分的资源预留操作
     * 检查余额是否足够，并且冻结积分
     *
     * @param vo      积分vo对象
     * @param context 事务上下文对象，该对象在try阶段传入null即可，RM会自动创建并注入该参数
     * @return 账户流水id 返回交易单号
     */
    @TwoPhaseBusinessAction(
            name = "tryPayment",
            commitMethod = "commitPayment",
            rollbackMethod = "rollbackPayment"
    )
    String tryPayment(@BusinessActionContextParameter(paramName = "vo") OperateIntegralVo vo,
                    BusinessActionContext context);

    /**
     * 二阶段 TCC 的 confirm 方法，执行确认资源扣除操作
     * 扣除真实积分 & 扣除冻结积分
     * 增加账户变动流水记录
     *
     * @param context 事务上下文对象
     * @return 账户流水 id 返回交易单号
     */
    void commitPayment(BusinessActionContext context);

    /**
     * 二阶段 TCC 的 rollback 方法，如果一阶段失败 对一阶段操作的数据进行回滚
     * 执行回滚 try 预留资源
     * 扣除 try 阶段冻结的金额
     *
     * @param context 事务上下文对象
     * @return 账户流水 id
     */
    void rollbackPayment(BusinessActionContext context);

}
